import Vue from "vue"

const olMap = {

    /**
     * @author QL
     * @param { Boolean } namespaced 
     * @date 2021-12-30 17:23:16
     * @description Store 配置对象分块的核心配置变量 用于状态存储分块的命名空间隔离相互独立避免合并命名空间，避免出现多库合并命名，造成命名重复的异常问题
     */
    namespaced: true,

    /**
     * @author QL
     * @param { Object } state 
     * @date 2021-12-30 17:23:16
     * @description Store配置对象的核心配置变量 用于状态存储的对象
     */
    state: {

        /**
         * @author QL
         * @param { Object } page_baseMap 
         * @date 2022-02-18 11:08:47
         * @description 页面级底图图层基础配置对象
         */
        page_baseMap: {},

        /**
         * @author QL
         * @param { Object } dialog_baseMap 
         * @date 2022-02-23 11:05:06
         * @description 模态框弹框级底图图层基础配置对象
         */
        dialog_baseMap: {},

        /**
         * @author QL
         * @param { Object } page_controls 
         * @date 2022-02-23 13:53:25
         * @description 页面级底图的控件实例缓存对象
         */
        page_controls: {},

        /**
         * @author QL
         * @param { Object } dialog_controls 
         * @date 2022-02-23 13:54:22
         * @description 模态框弹框级底图的控件实例缓存对象
         */
        dialog_controls: {},

        /**
         * @author QL
         * @param { Object } page_mapBusiness  
         * @date 2022-02-18 11:14:25
         * @description 自定义页面级 地图业务功能的实例对象
         */
        page_mapBusiness : {},

        /**
         * @author QL
         * @param { Object } dialog_mapBusiness  
         * @date 2022-02-23 11:06:22
         * @description 自定义模态框弹窗级 地图业务功能的实例对象
         */
        dialog_mapBusiness : {},

        /**
         * @author QL
         * @param { Object } globalError 
         * @date 2021-12-30 17:35:26
         * @description 自定义固有State消息状态， 用于返回getters, mutation二次包装方法出现的异常消息
         */
        globalError: {
            det: "vuex state error",
            msg: "未声明定义的state状态变量！"
        },

        /**
         * @author QL
         * @param { Object } globalSuccess 
         * @date 2021-12-30 17:36:30
         * @description 自定义固有State消息状态， 用于返回 mutation 二次包装方法回调函数的操作状态消息
         */
        globalSuccess: {
            det: "vuex state",
            msg: "operation success"
        }
    },

    /**
    * @author QL
    * @param { Object } getters 
    * @date 2021-12-30 17:23:16
    * @description Store 配置对象的状态取值方法配置对象
    */
    getters: {
        /**
         * @author QL
         * @functionName getBaseMap
         * @param { Object } state      当前Store的 state 配置对象计算属性
         * @param { String } valueName  自定义传参， 用于匹配查询state中对应名称的状态变量
         * @date 2021-12-30 17:24:47
         * @version V..
         * @description 该方法是一个采集器方法，用于收集所有用户传入的valueName相应名称规则的状态变量并返回，避免每个状态都需要配置一个getter
         */
        getBaseMap: (state) => (typeName) => {
            try {
                if (state[`${typeName}_baseMap`]) {
                    return state[`${typeName}_baseMap`]
                } else {
                    throw new Error("未声明定义的state状态！");
                }
            } catch (err) {
                //TODO handle the exception
                state.globalError.det = `getterDispenser err: ${typeName}_baseMap`;
                state.globalError.msg = err.message;
                return state.globalError;
            }
        },

        /**
         * @author QL
         * @functionName getControls
         * @param { Object } state      当前Store的 state 配置对象计算属性
         * @param { String } valueName  自定义传参， 用于匹配查询state中对应名称的状态变量
         * @date 2021-12-30 17:24:47
         * @version V..
         * @description 该方法是一个采集器方法，用于收集所有用户传入的valueName相应名称规则的状态变量并返回，避免每个状态都需要配置一个getter
         */
        getControls: (state) => (typeName, controlName) => {
            try {
                if (state[`${typeName}_controls`]) {
                    return state[`${typeName}_controls`][controlName]
                } else {
                    throw new Error("未声明定义的state状态！");
                }
            } catch (err) {
                //TODO handle the exception
                state.globalError.det = `getterDispenser err: ${typeName}_controls[${controlName}]`;
                state.globalError.msg = err.message;
                return state.globalError;
            }
        },

        /**
         * @author QL
         * @functionName getmapBusiness 
         * @param { Object } state      当前Store的 state 配置对象计算属性
         * @param { String } valueName  自定义传参， 用于匹配查询state中对应名称的状态变量
         * @date 2021-12-30 17:24:47
         * @version V..
         * @description 该方法是一个采集器方法，用于收集所有用户传入的valueName相应名称规则的状态变量并返回，避免每个状态都需要配置一个getter
         */
         getMapBusiness : (state) => (typeName) => {
            try {
                if (state[`${typeName}_mapBusiness`]) {
                    return state[`${typeName}_mapBusiness`]
                } else {
                    throw new Error("未声明定义的state状态！");
                }
            } catch (err) {
                //TODO handle the exception
                state.globalError.det = `getterDispenser err: ${typeName}_mapBusiness`;
                state.globalError.msg = err.message;
                return state.globalError;
            }
        },
    },

    /**
     * @author QL
     * @param { Object } getters 
     * @date 2021-12-30 17:23:16
     * @description Store 配置对象的状态赋值方法配置对象
     */
    mutations: {
        /**
         * @author QL
         * @functionName setBaseMap
         * @param { Object } state      当前Store的 state 配置对象计算属性
         * @param { String } valueName  自定义传参对象属性， 用于匹配查询state中对应名称的状态变量
         * @param { * } valueVal        自定义传参对象属性， 用于匹配到的State赋值更新状态值
         * @param { Function } fn       自定义传参对象属性， 用于回调反馈set操作是否成功的信息对象
         * @date 2021-12-30 17:29:44
         * @version V..
         * @description 该方法是一个采集器方法，用于将用户传入的valueName相匹配的State状态赋值更新成valueVal值，并通过fn回调函数返回操作的消息对象
         */
        setBaseMap: (state, { typeName, valueVal, fn }) => {
            try {
                if (state[`${typeName}_baseMap`]) {
                    Vue.set(state, `${typeName}_baseMap`, valueVal);
                    return fn(state.globalSuccess);
                } else {
                    throw new Error("未声明定义的state状态！");
                }
            } catch (err) {
                //TODO handle the exception
                state.globalError.det = `setterDispenser err: ${typeName}_baseMap`;
                state.globalError.msg = err.message;
                return fn(state.globalError);
            }
        },

        /**
         * @author QL
         * @functionName setControls
         * @param { Object } state      当前Store的 state 配置对象计算属性
         * @param { String } valueName  自定义传参对象属性， 用于匹配查询state中对应名称的状态变量
         * @param { * } valueVal        自定义传参对象属性， 用于匹配到的State赋值更新状态值
         * @param { Function } fn       自定义传参对象属性， 用于回调反馈set操作是否成功的信息对象
         * @date 2021-12-30 17:29:44
         * @version V..
         * @description 该方法是一个采集器方法，用于将用户传入的valueName相匹配的State状态赋值更新成valueVal值，并通过fn回调函数返回操作的消息对象
         */
        setControls: (state, { typeName, controlName, valueVal, fn }) => {
            try {
                if (state[`${typeName}_controls`]) {
                    if (valueVal) {
                        Vue.set(state[`${typeName}_controls`], controlName, valueVal);
                    } else {
                        delete state[`${typeName}_controls`][controlName];
                    }

                    return fn(state.globalSuccess);
                } else {
                    throw new Error("未声明定义的state状态！");
                }
            } catch (err) {
                //TODO handle the exception
                state.globalError.det = `setterDispenser err: ${state[`${typeName}_controls`]}`;
                state.globalError.msg = err.message;
                return fn(state.globalError);
            }
        },

          /**
         * @author QL
         * @functionName setmapBusiness 
         * @param { Object } state      当前Store的 state 配置对象计算属性
         * @param { String } valueName  自定义传参对象属性， 用于匹配查询state中对应名称的状态变量
         * @param { * } valueVal        自定义传参对象属性， 用于匹配到的State赋值更新状态值
         * @param { Function } fn       自定义传参对象属性， 用于回调反馈set操作是否成功的信息对象
         * @date 2021-12-30 17:29:44
         * @version V..
         * @description 该方法是一个采集器方法，用于将用户传入的valueName相匹配的State状态赋值更新成valueVal值，并通过fn回调函数返回操作的消息对象
         */
           setMapBusiness : (state, { typeName, valueVal, fn }) => {
            try {
                if (state[`${typeName}_mapBusiness`]) {
                    if (valueVal) {
                        Vue.set(state, `${typeName}_mapBusiness`, valueVal);
                    } else {
                        delete state[`${typeName}_mapBusiness`];
                    }

                    return fn(state.globalSuccess);
                } else {
                    throw new Error("未声明定义的state状态！");
                }
            } catch (err) {
                //TODO handle the exception
                state.globalError.det = `setterDispenser err: ${typeName}_mapBusiness`;
                state.globalError.msg = err.message;
                return fn(state.globalError);
            }
        }
    }
}

export default olMap